#include <stdio.h>

int main(int argc, char const *argv[])
{
    char  name[100][20]; // 栈
    strcpy(name[0], "Jack");
    strcpy(name[1], "Rose");
    strcpy(name[2], "Mike");

    static char  (name[100]) [20]; // 数据段，永不释放

    // 堆空间
    char (*name) [20] = malloc(100*20);
    strcpy(name[0], "Jack");
    strcpy(name[1], "Rose");
    strcpy(name[2], "Mike");

    // char (*name) [20] = calloc(100, 20);
    // char name[100][20];

    // // name管理内存的操作方式
    // char (*name) [10] = calloc(200, 10);
    // char name[200][10];

    // char (*name) [40] = calloc(50, 40); // 只管大小
    // char name[50][40];


    int a[3];
    f(a); // int (*a)

    int b[3][5];
    f(b); // int (*b) [5]

    int c[2][3][4];
    f(c); // int (*c) [3][4]

    char *d[3];
    f(d); // char *(*d)

    // 从左到右，找到第一个非关键字即为要声明的标识符
    // e
    // 从e的两边出发，剥洋葱的方式逐层解释
    int *(*e[3])(char , float);
    // |*|*|*|
    //  ↓
    int *function(char , float);
    f(e); // int *(* (*e) )(char, float);




    int *p; // 野指针
    *p = 100;

    // 自定义了一种类型（蓝图），类似int
    struct node
    {
        int a;
        char b;
    };

    struct node n;// 定义了一个结构体变量（房子）
    struct node *k; // 野指针
    k->a = 100;



    return 0;
}
